El notebook de Jupyter

  • Fue creado en el 2011 como parte del proyecto IPython, iniciado por Fernando Perez, un colombiano que en este momento trabaja como investigador en Estados Unidos.
  • En este momento cuenta con un equipo de 15 personas aproximadamente, y una financiacion de 6 millones de dolares para los proximos dos años.
  • Aunque esta hecho en Python y Javascript, no solo funciona para programar en Python sino tambien en Julia, R, Haskell, Spark, Ruby, F# y muchos otros lenguajes mas.

Tipos de celdas

El notebook cuenta con dos tipos de celdas:

Celdas de codigo

En estas celdas se escribe el codigo a evaluar, y tienen coloreado de sintaxis de acuerdo al lenguaje usado en el notebook.

Las celdas se evaluan con dos atajos de teclado:

  • Shift+Enter: Evalua la celda actual y se mueve a la siguiente, o crea una nueva celda si se encuentra al final del notebook.
  • Ctrl+Enter: Evalua la celda actual y se mantiene en esa celda.

In [ ]:
# Esta es una celda de codigo. 
# Se identifica por el texto del lado izquierdo que dice "In [ ]:"

#### Para editar esta celda, haz clic sobre la parte gris de la celda. 
#### Se indica que la celda esta en modo de edicion por el marco verde que la rodea.

#### Para seleccionar toda la celda, haz clic a la izquierda de la celda, u oprime la tecla Esc
#### Se indica que la celda esta en modo de comando por el marco azul que la rodea.
#### En modo de comando no se puede editar el texto de la celda, pero se puede mover, borrar, pegar, etc. toda la celda

# Los renglones que no comienzan con un hash (#) se toman como comandos para python, por ejemplo:
print("Hola")

Celdas de Markdown o texto

En estas celdas se puede escribir texto para aclarar, explicar o describir el codigo que se esta desarrollando en el notebook. Esto se hace siguiendo ciertas convenciones que son interpretadas por el notebook para generar titulos, ecuaciones o links a partir de las mismas, al oprimir Shift+Enter o Ctrl+Enter sobre la celda.

Esta es una celda de Markdown o texto. Se identifica porque del lado izquierdo no aparece "In [ ]:".

Para visualizar esta celda, entra en modo de edicion (haciendo clic sobre la parte gris de la celda) y oprime Shift+Enter o Ctrl+Enter.

Esta tambien es una celda de Markdown o texto. Para editarla (es decir, para ver el texto plano que genera el html de la visualizacion) haz doble clic sobre este texto.

Markdown

Markdown es un lenguaje de marcado (markup) que convierte texto plano (con algunas convenciones) en html listo para visualizar. Algunas de las convenciones de markdown son:

Titulos

Titulos con distintos niveles de jerarquia se definen de la siguiente forma:

  • # 1: Titulos
  • ## 2: Subtitulos
  • ### 3: Sub-subtitulos

Enfasis

Es posible escribir texto con distintos tipos de enfasis, siguiendo estas convenciones:

  • **hola**, __hola__: Texto en negritas
  • *hola*, _hola_: Texto en cursivas
  • hola: Texto en fuente mono-espaciada
  • ~~hola~~: Texto tachado

Para crear links que referencien otras paginas web, se usa esta convencion:

  • [Buscar en Google](http://www.google.com)

Codigo

Tambien es posible escribir codigo en una celda de texto, aunque este no se evalua al renderizar la celda, tal como ocurriria en una celda de codigo.

La convencion para hacer esto es

def f(x):
    pass

Nota: Es posible elegir cualquier lenguaje de programacion para escribir codigo en celdas de texto, no solo Python o el lenguaje principal del notebook.

Matematicas

Para escribir ecuaciones matematicas en una celda de texto, se utiliza LaTeX rodeado de simbolos de pesos, asi:

$$\frac{a^5}{b^2}$$

Se ve así: $$\frac{a^5}{b^2}$$.

Imagenes

Imagenes locales o de internet se pueden incluir de la siguiente manera:

<img src="img/Lego_astronaut.png">

Mas convenciones

Estas son solo algunas de las convenciones usadas en Markdown. Para aprender sobre las demas convenciones disponibles, se debe dirigir a este sitio web.

Modos de interaccion de teclado

El notebook cuenta con dos modos de interaccion a traves del teclado, cada uno con su propio conjunto de atajos. Es importante entender como funcionan estos modos, porque de ello depende un uso fluido y eficiente del notebook.

Nota: Para mirar los atajos disponibles, pueden dirigirse al menu

Help > Keyboard shortcuts

El modo de edicion

Este modo se activa cuando se esta escribiendo codigo o texto en una celda del tipo respectivo. Se identifica que se esta usando este modo porque la celda se encuentra resaltada en verde.

En este modo funcionan los atajos que normalmente tambien estan presentes en otros editores de texto (e.g. Word, TextMate, Atom, Sublime Text, etc), tales como:

  • Ctrl+C: Copiar
  • Ctrl+V: Pegar
  • Ctrl+X: Cortar
  • Ctrl+Z: Deshacer
  • Ctrl+Shift+Z: Rehacer
  • Ctrl+A: Seleccionar todo el texto de la celda

El modo de comando

Este modo se activa cuando se oprime Esc en una celda de codigo o texto, y se identifica porque la celda se resalta en azul en lugar de verde.

Este modo permite realizar distintas operaciones sobre las celdas en si, en lugar de hacerlo en el texto que contienen. Algunas de estas operaciones, con su atajo de teclado correspondiente, son:

  • B: Para añadir una celda de codigo debajo (Below) de la celda actual.
  • A: Para añadir una celda de codigo sobre (Above) la celda actual.
  • M: Para convertir la celda actual en una celda de Markdown.
  • Y: Para convertir la celda actual en una celda de codigo.
  • D-D: Al oprimir dos veces la tecla D en rapida sucesion, se elimina (Delete) la celda actual.
  • C: Copia la celda actual.
  • X: Corta la celda actual.
  • V: Pega una celda que fue copiada o cortada anteriormente.

Modelo de evaluacion:

El notebook cuenta con un modelo de evaluacion frontend/kernel. Este modelo separa la interfaz (frontend) en la que se escribe el codigo (en este caso la aplicacion web en la que funciona el notebook) del proceso o nucleo (kernel) en el cual se ejecuta dicho codigo.

Esto permite que la interfaz no se bloquee, y que se pueda seguir utilizando para escribir mas codigo o texto, mientras se esta evaluando algo en el kernel.

Por ejemplo, al correr el siguiente codigo:

while True:
    a = 1

se genera un loop infinito. Sin embargo, se puede observar que mientras el kernel se encuentra ocupado con el mismo, se puede seguir utilizando el notebook sin problemas. La unica diferencia es que el indicador (o prompt) de la celda actual aparecera como In [*], para mostrar que esta esperando respuesta del kernel.

Para interrumpir dicho codigo, se puede ir al menu

Kernel > Interrupt

Tambien es posible evaluar otras celdas aunque el kernel se encuentre ocupado. Estas se ejecutaran secuencialmente en el orden en que fueron evaluadas, despues de que la ejecucion actual haya terminado.

Usos del notebook

Aunque el notebook es muy util y ha generado una revolucion en la forma en que se escribe y comparte codigo cientifico en los ultimos cinco años, muchos programadores han llegado al consenso de que el notebook deberia ser usado, en la medida de lo posible, solo para realizar actividades exploratorias (e.g. prototipos iniciales de codigo, entender los datos a analizar, hacer graficas que indiquen como podrian estudiarse esos datos, etc) o para escribir reportes que mezclen codigo, texto, ecuaciones y graficas.

Una vez que se haya pasado esta etapa exploratoria, lo ideal es mover el codigo fuera del notebook hacia archivos de texto plano con la extension .py, que pueden evaluarse de la forma

python my_archivo.py

en una terminal. Algunas de las ventajas de este enfoque son:

  1. Dividir y estructurar de mejor forma el codigo en distintos archivos, en lugar de tener que seguir añadiendo codigo en un unico notebook, el cual puede terminar siendo gigantesco.
  2. Poder usar de forma mas sencilla git para hacer versionado sobre esos archivos. Aunque los notebooks tambien son archivos de texto plano bajo la superficie, no son facilmente versionables.
  3. Evitar el que los resultados obtenidos en el notebook terminen siendo dependientes del orden en que fueron evaluadas las celdas en el mismo.
  4. Poder evaluar el codigo independientemente del notebook, lo cual puede ser util cuando se ejecuta en clusters o en computadores que no tienen instalado el notebook.

Otros aspectos del notebook

El notebook cuenta con todo un ecosistema de paquetes y aplicaciones construidas alrededor del mismo. Algunos de ellos son:

  1. Ipywidgets: Permite a los usuarios crear animaciones o aplicaciones interactivas del codigo que esten desarrollando, las cuales se ejecutan directamente dentro del notebook.

  2. Jupyterhub: Permite administrar un conjunto de usuarios, cada uno con su instancia particular del notebook, de forma unificada, i.e. utilizando un unico punto de acceso y una sola forma de autenticacion (e.g. cuentas de Unix o LDAP).

  3. Nbgrader: Provee un sistema para asignar y calificar tareas creadas como notebooks.

  4. Notebooks en Azure: Permite ejecutar notebooks en la plataforma en la nube Azure de Microsoft.

  5. Binder: Permite correr notebooks en vivo desde repositorios de github utilizando maquinas virtuales en la nube.

El material de este notebook fue recopilado para Clubes de Ciencia Colombia 2017 por Luis Henry Quiroga (GitHub: lhquirogan) - Germán Chaparro (GitHub: saint-germain), y fue adaptado de https://github.com/PythonBootcampUniandes